//es6 解决异步编程的

//两个特征：1>function和函数名之间有个*2>yield 定义内部状态

//返回值：iterator遍历器对象  for... of... next()

// function *hello(){
//     yield 'hello'
//     yield 'world'
//     return 'end'
// }

// let h = hello();

// console.log(h.next());

// console.log(h.next());

// console.log(h.next());

// function *getString(){
//     let str = yield new Promise((resolve,reject) => {  //yield 只执行语句不返回值
//         setTimeout(() => {
//             resolve('abc')
//         },1000)
//     })
//     console.log(str);
//     return str.split('').reverse().join('')
// }

// let h = getString();

// console.log(h.next());

// console.log(h.next());

//ES7  async解决异步编程的 generator的语法糖

//返回值：promise对象

// async function getString(){
//     let str = await new Promise((resolve,reject) => {  
//         setTimeout(() => {
//             resolve('abc')
//         },1000)
//     })
//     return str.split('').reverse().join('')
// }
// let getString = async () => {

// }

// let p1 = getString();

// console.log(p1);

/**
 * 1>async内置执行器
 * 
 * 2>async返回值是promise对象
 * 
 * 3>await不仅执行语句还有返回值
 * */ 

// p1.then((res) => {
//     console.log(res);
// })

// const fs = require('fs');

// function renderFile(url){
//     return new Promise((resolve,reject) => {
//         fs.readFile(url,'utf8',(error,data) => {
//             if(error){
//                 return reject(error)
//             }

//             resolve(data)
//         })
//     })
// }

// async function render(){
//     let html = await renderFile('./src/template.html');
//     let css = await renderFile('./src/style.css');

//     return html.replace(/{{style}}/,`<style>${css}</style>`)
// }

// render().then((res) => {
//     console.log(res);
// })

function ajax(url){
    return new Promise((resolve,reject) => {
        let xhr = new XMLHttpRequest();
        xhr.open('GET',url);
        xhr.send(null);
        xhr.onreadystatechange = () => {
            if(xhr.readyState != 4)return;
            if(xhr.status === 200){
                resolve(JSON.parse(xhr.responseText))
            }else{
                reject(new Error('error'))
            }
        }
    })   
}

async function getBill(){
    let uid = await ajax('/api/getuid');
    try{
        await Promise.reject('abc');
    }catch(error){
        console.warn(error);
    }
    console.log("=====")
    let list = await ajax('/api/list?uid='+uid);
    return list
}
getBill().then(res => {
    console.log(res)
}).catch(error => {
    console.warn(error);
})

//loading出现----> 多个ajax ---->  loading消失

// async function getData(){
//     let data = await Promise.all([ajax('/api/list'),ajax('/api/banner')])

//     return data
// }

// getData().then((res) => {
//     console.log(res)
// })












